/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.mindbox.mueblesalpes.negocio.persistence;

import com.mindbox.mueblesalpes.negocio.exception.ErrorCommit;
import com.mindbox.mueblesalpes.negocio.exception.ErrorInitTransaction;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.transaction.NotSupportedException;
import javax.transaction.Status;
import javax.transaction.SystemException;
import javax.transaction.UserTransaction;

/**
 *
 * @author jsanchez
 */
public class UtilidadesPersistencia {

    /**
     * Obtiene si existe el registro en la tabla indicada
     * @param conexion
     * @param id - ID a buscar
     * @param tabla - Nombre de la tabla
     * @return boolean
     * @throws java.sql.SQLException
     */
    public static boolean existeId(Connection conexion, Long id, String tabla) throws SQLException {
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            ps = conexion.prepareStatement("SELECT * FROM " + tabla + " WHERE id = ?");
            ps.setLong(1, id);
            rs = ps.executeQuery();
            if (rs != null)
                return rs.next();
        } finally {
            cerrarResultSets(rs);
            cerrarPreparedStatements(ps);
        }
        throw new RuntimeException("No se pudo realizar la consulta del Identificador");
    }

    /**
     * Inicia la transacción de una Transacción de BEAN
     * @param ut
     */
    public static void initTransaction(UserTransaction ut) throws ErrorInitTransaction {
        try {
            ut.begin();
        } catch (NotSupportedException ex) {
            throw new ErrorInitTransaction(ex);
        } catch (SystemException ex) {
            throw new ErrorInitTransaction(ex);
        }
    }

    /**
     * Realizar commit de la transacción de una Transacción de BEAN
     * @param ut
     * @exception ErrorCommit
     */
    public static void commitTransaction(UserTransaction ut) throws ErrorCommit {
        try {
            if (ut.getStatus() != Status.STATUS_ROLLEDBACK) {
                ut.commit();
            }
        } catch (Exception ex) {
            try {
                ut.rollback();
            } catch (Exception e) {
                throw new ErrorCommit(e);
            }
            throw new ErrorCommit(ex);
        }
    }

    /**
     * Realiza el rollback de la transacción de una Transacción de BEAN
     * @param ut
     */
    public static void rollBackTransaction(UserTransaction ut) {
        try {
            ut.rollback();
        } catch (Exception e) {
            Logger.getLogger(UtilidadesPersistencia.class.getName()).log(Level.SEVERE, null, e);
        }
    }

    /**
     * Cierra las conexiones
     * @param conexion
     */
    public static void cerrarConexiones(Connection... conexion) {
        if (conexion != null) {
            for (Connection con : conexion) {
                try {
                    con.close();
                } catch (SQLException ex) {
                    Logger.getLogger(UtilidadesPersistencia.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    }

    /**
     * Cierra los result set
     * @param rss
     */
    public static void cerrarResultSets(ResultSet... rs){
        if(rs != null){
            for(ResultSet r : rs){
                try {
                    if(r != null)
                        r.close();
                } catch (SQLException ex) {
                    Logger.getLogger(UtilidadesPersistencia.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    }

    /**
     * Cierra los preparedStatement
     * @param ps
     */
    public static void cerrarPreparedStatements(PreparedStatement... ps){
        if(ps != null){
            for(PreparedStatement p : ps){
                try {
                    if(p != null)
                        p.close();
                } catch (SQLException ex) {
                    Logger.getLogger(UtilidadesPersistencia.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    }
}
